[Amazon FSx for NetApp ONTAP] ECS上のコンテナからボリュームをマウントしてみた
ECSからFSxNのボリュームをマウントする方法を知りたい
こんにちは、のんピ(@non____97)です。
皆さんはECSからAmazon FSx for NetApp ONTAP(以降FSxN)のボリュームをマウントする方法を知りたいなと思ったことはありますか? 私はあります。
データ分析バッチ処理などの高スループット、高IOPSが求められるワークロードやデータの永続化をするためにFSxNのボリュームをマウントしたい場面があります。
「どうやってマウントするのかな?」と調べていると、AWS公式ドキュメントに答えが書いてありました。
どうやらバインドマウントでFSxNのボリュームをマウントするようです。
実際に試してみました。
いきなりまとめ
- 2024/2/19ではECS on EC2のみ対応
- ECS on Fargateは非対応
- バインドマウントでマウントする
やってみた
検証環境構成
検証環境の構成は以下のとおりです。
FSxNのボリュームは以下のとおりです。
::> volume show -fields security-style, junction-path vserver volume security-style junction-path ------- -------- -------------- ------------- svm svm_root unix / svm vol1 unix /vol1 2 entries were displayed.
vol1をNFSでマウントします。
ECS on EC2の用意
ECS on EC2を用意します。VPCやFSxNは既にデプロイ済みです。
今回はAWS CDKでデプロイしました。
コンテナインスタンスのユーザーデータでFSxNのボリュームをマウントしてあげて、その領域をバインドマウントします。
import * as cdk from "aws-cdk-lib"; import { Construct } from "constructs"; export class EcsStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const vpcId = "vpc-043c0858ea33e8ec2"; const sourceVolume = "fsxn-vol1"; const sourcePath = "/mnt/fsxn/vol1"; const containerPath = "/vol1"; const junctionPath = "vol1"; const nfsDnsName = "svm-0a277039fa1e73d6a.fs-0130e4e832527894e.fsx.us-east-1.amazonaws.com"; // VPC const vpc = cdk.aws_ec2.Vpc.fromLookup(this, "Vpc", { vpcId, }); // ECS Cluster const cluster = new cdk.aws_ecs.Cluster(this, "Cluster", { vpc, containerInsights: true, }); // Container Instance cluster .addCapacity("DefaultAutoScalingGroupCapacity", { instanceType: new cdk.aws_ec2.InstanceType("t3.small"), machineImage: cdk.aws_ec2.MachineImage.fromSsmParameter( "/aws/service/ecs/optimized-ami/amazon-linux-2023/recommended/image_id" ), maxCapacity: 1, minCapacity: 1, associatePublicIpAddress: true, vpcSubnets: { subnetType: cdk.aws_ec2.SubnetType.PUBLIC }, ssmSessionPermissions: true, }) .userData.addCommands( `mkdir -p ${sourcePath}`, `echo -e "${nfsDnsName}:${junctionPath}\t${sourcePath}\tnfs\tnfsvers=4,_netdev,noresvport,defaults\t0\t0" | tee -a /etc/fstab`, `systemctl daemon-reload`, `mount -a`, "df -hT" ); // Task Definition const taskDefinition = new cdk.aws_ecs.Ec2TaskDefinition( this, "TaskDefinition" ); taskDefinition.addVolume({ name: sourceVolume, host: { sourcePath, }, }); taskDefinition .addContainer("SampleContainer", { image: cdk.aws_ecs.ContainerImage.fromRegistry( "amazon/amazon-ecs-sample" ), memoryLimitMiB: 256, }) .addMountPoints({ sourceVolume, containerPath, readOnly: false, }); // ECS Service new cdk.aws_ecs.Ec2Service(this, "Service", { cluster, taskDefinition, desiredCount: 2, circuitBreaker: { enable: true }, enableExecuteCommand: true, }); } }
使用したコードは以下リポジトリに保存しています。
デプロイ後にタスク定義を確認すると、バインドマウントの設定がされていました。
FSxNのボリュームをマウントできているか確認
FSxNのボリュームをマウントできているか確認します。
EC2インスタンス上からFSxNのボリュームをマウントできているかです。
$ hostname -f ip-10-0-0-148.ec2.internal $ df -hT Filesystem Type Size Used Avail Use% Mounted on devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev tmpfs tmpfs 951M 0 951M 0% /dev/shm tmpfs tmpfs 381M 728K 380M 1% /run /dev/nvme0n1p1 xfs 30G 2.7G 28G 9% / tmpfs tmpfs 951M 0 951M 0% /tmp /dev/nvme0n1p128 vfat 10M 1.3M 8.7M 13% /boot/efi svm-0a277039fa1e73d6a.fs-0130e4e832527894e.fsx.us-east-1.amazonaws.com:/vol1 nfs4 61G 448K 61G 1% /mnt/fsxn/vol1 $ cat /etc/fstab # UUID=cf7f5187-deab-4eff-bb4b-616b8aa7ddcc / xfs defaults,noatime 1 1 UUID=994B-8B56 /boot/efi vfat defaults,noatime,uid=0,gid=0,umask=0077,shortname=winnt,x-systemd.automount 0 2 svm-0a277039fa1e73d6a.fs-0130e4e832527894e.fsx.us-east-1.amazonaws.com:vol1 /mnt/fsxn/vol1 nfs nfsvers=4,_netdev,noresvport,defaults 0 0 $ ls -l /mnt/fsxn/vol1 total 0 $ ls -ld /mnt/fsxn/vol1 drwxr-xr-x. 2 root root 4096 Feb 19 08:17 /mnt/fsxn/vol1
マウントできていました。
適当にファイルを追加します。
$ sudo touch /mnt/fsxn/vol1/container_instance.txt $ ls -l /mnt/fsxn/vol1 total 0 -rw-r--r--. 1 root root 0 Feb 19 08:17 container_instance.txt
ECS Execでコンテナに接続します。
$ aws ecs execute-command \ --cluster EcsStack-ClusterEB0386A7-lrNwJL7PjHYZ \ --task 3e6614aa5dc74daebbbf1f4703b1d36c \ --container SampleContainer \ --interactive \ --command "/bin/sh"
$ df -hT Filesystem Type Size Used Avail Use% Mounted on overlay overlay 30G 2.7G 28G 10% / tmpfs tmpfs 64M 0 64M 0% /dev svm-0a277039fa1e73d6a.fs-0130e4e832527894e.fsx.us-east-1.amazonaws.com:/vol1 nfs4 61G 448K 61G 1% /vol1 /dev/nvme0n1p1 xfs 30G 2.7G 28G 10% /etc/hosts shm tmpfs 64M 0 64M 0% /dev/shm tmpfs tmpfs 951M 0 951M 0% /proc/acpi tmpfs tmpfs 951M 0 951M 0% /sys/firmware $ ls -ld /vol1 drwxr-xr-x. 2 root root 4096 Feb 19 08:17 /vol1 $ ls -l /vol1 total 0 -rw-r--r--. 1 root root 0 Feb 19 08:17 container_instance.txt
ECSのコンテナ上でもEC2インスタンスから作成されたファイルを確認できました。
さらに適当にファイルを追加します。
$ touch /vol1/3e6614aa5dc74daebbbf1f4703b1d36c.txt $ ls -l /vol1 total 0 -rw-r--r--. 1 root root 0 Feb 19 08:25 3e6614aa5dc74daebbbf1f4703b1d36c.txt -rw-r--r--. 1 root root 0 Feb 19 08:17 container_instance.txt
別のコンテナにもECS Execで接続します。
$ aws ecs execute-command \ --cluster EcsStack-ClusterEB0386A7-lrNwJL7PjHYZ \ --task c482c7b3dcd248d6a8bac2b437bd90a5 \ --container SampleContainer \ --interactive \ --command "/bin/sh"
$ df -hT Filesystem Type Size Used Avail Use% Mounted on overlay overlay 30G 2.7G 28G 10% / tmpfs tmpfs 64M 0 64M 0% /dev svm-0a277039fa1e73d6a.fs-0130e4e832527894e.fsx.us-east-1.amazonaws.com:/vol1 nfs4 61G 384K 61G 1% /vol1 /dev/nvme0n1p1 xfs 30G 2.7G 28G 10% /etc/hosts shm tmpfs 64M 0 64M 0% /dev/shm tmpfs tmpfs 951M 0 951M 0% /proc/acpi tmpfs tmpfs 951M 0 951M 0% /sys/firmware $ ls -ld /vol1 drwxr-xr-x. 2 root root 4096 Feb 19 08:25 /vol1 $ ls -l /vol1 total 0 -rw-r--r--. 1 root root 0 Feb 19 08:25 3e6614aa5dc74daebbbf1f4703b1d36c.txt -rw-r--r--. 1 root root 0 Feb 19 08:17 container_instance.txt $ touch /vol1/c482c7b3dcd248d6a8bac2b437bd90a5.txt $ ls -l /vol1 total 0 -rw-r--r--. 1 root root 0 Feb 19 08:25 3e6614aa5dc74daebbbf1f4703b1d36c.txt -rw-r--r--. 1 root root 0 Feb 19 08:27 c482c7b3dcd248d6a8bac2b437bd90a5.txt -rw-r--r--. 1 root root 0 Feb 19 08:17 container_instance.txt
コンテナ間、コンテナ-EC2インスタンス間で同じ領域を参照していることを確認できました。
ECSタスク入れ替え後の確認
ECSタスクを入れ替えても継続してボリュームに書き込んだファイルを確認できるかチェックします。
新しいタスクが立ち上がったことを確認します。
ECS Execでコンテナに入り、変わらずマウントできていることを確認します。
aws ecs execute-command \ --cluster EcsStack-ClusterEB0386A7-lrNwJL7PjHYZ \ --task 0ece3561f98d433a9add51d4be2038c6 \ --container SampleContainer \ --interactive \ --command "/bin/sh"
$ df -hT Filesystem Type Size Used Avail Use% Mounted on overlay overlay 30G 2.7G 28G 10% / tmpfs tmpfs 64M 0 64M 0% /dev svm-0a277039fa1e73d6a.fs-0130e4e832527894e.fsx.us-east-1.amazonaws.com:/vol1 nfs4 61G 448K 61G 1% /vol1 /dev/nvme0n1p1 xfs 30G 2.7G 28G 10% /etc/hosts shm tmpfs 64M 0 64M 0% /dev/shm tmpfs tmpfs 951M 0 951M 0% /proc/acpi tmpfs tmpfs 951M 0 951M 0% /sys/firmware $ ls -l /vol1 total 0 -rw-r--r--. 1 root root 0 Feb 19 08:25 3e6614aa5dc74daebbbf1f4703b1d36c.txt -rw-r--r--. 1 root root 0 Feb 19 08:27 c482c7b3dcd248d6a8bac2b437bd90a5.txt -rw-r--r--. 1 root root 0 Feb 19 08:17 container_instance.txt
マウントできていますね。
EC2インスタンス入れ替え後の確認
EC2インスタンス入れ替え後の確認も行います。
コンテナインスタンスを停止させます。
Auto Scalingにより、新しくEC2インスタンスが立ち上がったことを確認します。
新しく立ち上がったコンテナインスタンスにSSMセッションマネージャーで接続し、FSxNのボリュームをマウントできているか確認します。
$ hostname -f ip-10-0-1-156.ec2.internal $ df -hT Filesystem Type Size Used Avail Use% Mounted on devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev tmpfs tmpfs 951M 0 951M 0% /dev/shm tmpfs tmpfs 381M 520K 380M 1% /run /dev/nvme0n1p1 xfs 30G 2.3G 28G 8% / tmpfs tmpfs 951M 0 951M 0% /tmp /dev/nvme0n1p128 vfat 10M 1.3M 8.7M 13% /boot/efi svm-0a277039fa1e73d6a.fs-0130e4e832527894e.fsx.us-east-1.amazonaws.com:/vol1 nfs4 61G 448K 61G 1% /mnt/fsxn/vol1 $ ls -l /mnt/fsxn/vol1 total 0 -rw-r--r--. 1 root root 0 Feb 19 08:25 3e6614aa5dc74daebbbf1f4703b1d36c.txt -rw-r--r--. 1 root root 0 Feb 19 08:27 c482c7b3dcd248d6a8bac2b437bd90a5.txt -rw-r--r--. 1 root root 0 Feb 19 08:17 container_instance.txt $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6997752d6174 amazon/amazon-ecs-agent:latest "/agent" 4 minutes ago Up 4 minutes (healthy) ecs-agent $ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3f871a0b5c27 amazon/amazon-ecs-sample "/usr/sbin/apache2 -…" 20 seconds ago Up 19 seconds 80/tcp ecs-EcsStackTaskDefinition458D056A-16-SampleContainer-d4c2a3d3c8bbe5c00e00 6f38d7fed62d amazon/amazon-ecs-sample "/usr/sbin/apache2 -…" 20 seconds ago Up 18 seconds 80/tcp ecs-EcsStackTaskDefinition458D056A-16-SampleContainer-9cd3d892c89b87a88601 6997752d6174 amazon/amazon-ecs-agent:latest "/agent" 5 minutes ago Up 5 minutes (healthy) ecs-agent
新しいコンテナインスタンス上で稼動しているコンテナにECS Execで接続します。
$ aws ecs execute-command \ --cluster EcsStack-ClusterEB0386A7-lrNwJL7PjHYZ \ --task 741cc4b4ae2b43c182c95e3563c032e6 \ --container SampleContainer \ --interactive \ --command "/bin/sh"
$ df -hT Filesystem Type Size Used Avail Use% Mounted on overlay overlay 30G 2.7G 28G 10% / tmpfs tmpfs 64M 0 64M 0% /dev svm-0a277039fa1e73d6a.fs-0130e4e832527894e.fsx.us-east-1.amazonaws.com:/vol1 nfs4 61G 448K 61G 1% /vol1 /dev/nvme0n1p1 xfs 30G 2.7G 28G 10% /etc/hosts shm tmpfs 64M 0 64M 0% /dev/shm tmpfs tmpfs 951M 0 951M 0% /proc/acpi tmpfs tmpfs 951M 0 951M 0% /sys/firmware $ ls -l /vol1 total 0 -rw-r--r--. 1 root root 0 Feb 19 08:25 3e6614aa5dc74daebbbf1f4703b1d36c.txt -rw-r--r--. 1 root root 0 Feb 19 08:27 c482c7b3dcd248d6a8bac2b437bd90a5.txt -rw-r--r--. 1 root root 0 Feb 19 08:17 container_instance.txt
コンテナ上からもFSxNのボリューム内のファイルを確認できました。永続化できていますね。
ECSでハイパフォーマンスな永続ストレージにデータを保存したいときに
ECS on EC2においてFSxNのボリュームにNFSでマウントする方法を紹介しました。
ECSでハイパフォーマンスな永続ストレージにデータを保存したいときにお世話になりそうです。EFSやS3、FSx for Windows File Serverとの費用対効果を比較して、最適化なストレージを選択しましょう。
この記事が誰かの助けになれば幸いです。
以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!